package com.example.designhbwxz.book.adapter;

import com.alibaba.fastjson.JSONObject;
import com.example.designhbwxz.book.pojo.UserInfo;
import com.example.designhbwxz.book.service.impl.UserServiceImpl;
import com.example.designhbwxz.book.utils.HttpClientUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 第三方登陆业务适配器
 * <p>
 * 通过继承 UserService ，复用已有方法，并在此处进行代码扩展，实现第三方账号授权登陆功能
 *
 * @author shenzw
 * @date 2023/10/23
 */
@Component
@Slf4j
public class Login3rdAdapter extends UserServiceImpl implements Login3rdTarget {


    @Value("${gitee.state}")
    private String giteeState;

    @Value("${gitee.token.url}")
    private String giteeTokenUrl;

    @Value("${gitee.user.url}")
    private String giteeUserUrl;

    @Value("${gitee.user.prefix}")
    private String giteeUserPrefix;

    /**
     * Gitee账号登陆
     *
     * @param code  code
     * @param state state
     * @return String
     */
    @Override
    public String loginByGitee(String code, String state) {
        // 进行 state 判断，state 的值是前端与后端商定好的，前端将 state 传给 Gitee 平台，Gitee 平台回传 state 给回调接口
        if (!giteeState.equals(state)) {
            return "invalid state！";
        }

        // 请求 Gitee 平台获取 Token，并携带 code
        String tokenUrl = giteeTokenUrl.concat(code);
        JSONObject tokenResponse = HttpClientUtils.execute(tokenUrl, HttpMethod.POST);
        String token = tokenResponse.getString("access_token");

        // 请求用户信息并携带 Token
        String userUrl = giteeUserUrl.concat(token);
        JSONObject userInfoResponse = HttpClientUtils.execute(userUrl, HttpMethod.GET);

        // 获取用户信息，userName 添加前缀 GITEE@，密码保持与 userName 一致，
        String userName = giteeUserPrefix.concat(userInfoResponse.getString("name"));

        // 自动注册和登陆功能，此处体现了方法的复用
        return autoRegister3rdAndLogin(userName, userName);
    }

    /**
     * 自动注册和登陆功能
     *
     * @param userName 用户名
     * @param password 密码
     * @return String
     */
    private String autoRegister3rdAndLogin(String userName, String password) {
        // 如果第三方账号已经登陆过了，则直接登陆
        if (super.checkUserExists(userName)) {
            return super.login(userName, password);
        }

        // 如果没有登陆过
        // 组装用户信息
        UserInfo userInfo = UserInfo.builder()
                .userName(userName)
                .userPassword(password)
                .createDate(new Date())
                .build();

        // 到这一步说明第三方账号是第一次登陆，先进行注册
        super.register(userInfo);

        // 自动注册完成后进行登陆
        return super.login(userName, password);
    }

    /**
     * 微信登陆
     *
     * @param params 入参
     * @return String
     */
    @Override
    public String loginByWechat(String... params) {
        return null;
    }

    /**
     * QQ登陆
     *
     * @param params 入参
     * @return String
     */
    @Override
    public String loginByQq(String... params) {
        return null;
    }
}
